package edu.qd.learn.day1301;

/**
 * 线性存储结构的一种
 * <p>
 * 链式 存储结构
 * 数组 顺序
 * <p>
 * 空间  ： 链  空间连续  寻址
 * [前置指针域|数据域|后置指针域]  结点
 * 单向  :
 * <p>
 * 双向
 * <p>
 * 循环
 *
 * @author 布衣
 */
public class LinkedData {
    //头节点
    private Node head;
    //尾结点
    private Node tail;

    private int size;

    /**
     * 链表的添加方法 [头插法| 尾插法]
     */
    public boolean add(int data){
        size++;
        if(head == null){
            head = new Node(data);
            tail = head;
            return true;
        }
        tail.next = new Node(data);
        tail = tail.next;
        return true;
    }

    /**
     * 有效元素个数
     * @return
     */
    public int size(){
        return size;
    }

    /**
     * 头插法
     * @return
     */
    public boolean addHead(int data){
        size++;
        if(head == null){
            head = new Node(data);
            tail = head;
            return true;
        }
        Node temp = new Node(data,head);
        head = temp;
        return true;
    }

    /**
     * redis list [头插  尾取  (队列)]
     * [头插  头取  (栈)]
     * @param current
     * @return
     */
    private Node getLast(Node current){
        if(current.next == null){
            return current;
        }
        return getLast(current.next);
    }

    /**
     * 结点 内部类
     */
    private class Node {
        private int data; //数据域
        private Node next; //后置指针域

        public Node(int data) {
            this.data = data;
        }

        public Node(int data, Node next) {
            this.data = data;
            this.next = next;
        }

        public int getData() {
            return this.data;
        }

        public Node getNext() {
            return this.next;
        }

    }

    public void rotateRight(int k){
        //链表的尾移动头
        int num = 0;
        Node temp = head;

        while(temp.next != null && num++ <size - (k > size ? k % size : k)-1){
            temp = temp.next;
        }

        //倒数第二个元素
        Node last = temp.next;
        temp.next = null;
        tail.next = head;
        head = last;
        tail=temp;
    }

    public static void main(String[] args) {
        LinkedData l = new LinkedData();
        l.add(1);
        l.add(2);
        l.add(3);
        l.add(4);

        l.add(5);
        l.add(6);

        l.rotateRight(2);


    }

}
